Expression 2
Disclaimer Everything is copy-pasted from: wiki.wiremod.com And belongs to his owner. Just incase I need some informations and the above-named site is not available. I DO NOT use this informations in ANY commercial way. Features Syntax The syntax in the Expression 2 will take some time to get used to, but will give you a lot of power over your expressions. Remember there is not just one way to code something, you can accomplish the same task in several ways. In Expression 2 conditionals, numbers are considered false if they equal 0. Otherwise, they are considered true. Functions and methods which conceptually return "true" or "false" return 1 and 0 respectively. : Variables In Expression 2, all variables must start with a capital letter. For instance: : @trigger-directive The trigger directive can selectively enable or disable inputs from triggering executions. Possible values are all/none, but also a list of inputs. : @model-directive The model directive can be used to set the model of your expression chip. @model *model path* Loops E2 features three types of loop: while loops, for loops and foreach loops. These allow instructions to be repeated many times in one execution, rather than relying on multiple executions to perform repeat tasks. Be aware that loops that perform too many instructions during an execution will exceed the E2's op quota and cause it to stop running (see "Performance" below). : Performance Did some performance tests in Garry's Mod to see what it could churn out: ~3.000.000/s arithmetic operations (+-*/) on numbers, 2000 ops, 200 executions in 0.13s ~850.000/s arithmetic operations (+-*/) on vectors, 2000 ops, 100 executions in 0.23s Although E2 can do a lot, it has quotas to prevent servers from lagging. If the amount of ops used in a tick exceeds the tickquota, then the expression shuts down. Every tick, the ops used minus the softquota is added to a counter, if that counter exceeds the hardquota, then the expression shuts down. If your expression is shutting down, then it is recommended you learn better coding practices, such as storing commonly used values in a variable. Editor Shortcut Keys : Tutorials If you make a guide related to E2, please feel free to add it to this list! *ElementWire's YouTube channel *UltimateWire's YouTube channel *Revan's Expression Gate 2 Guide - The Basics *In-depth guide by Matte *Expression 2 Guide *Expression 2 Examples *E2 And Plugs with Buttons Console Commands : Note: Most E2 addons do not register themselves as extensions and thus cannot be turned on or off with the above commands. A notable exception is the propcore extension in the UWSVN, which is disabled by default. Also, you must run wire_expression2_reload in order for enabling/disabling extensions to take effect. Datatypes Expression2 uses several datatypes and to keep the wiki at a reasonable size we use a shorthand for those datatypes, here is a list of all the shorthands used and the datatype they represent. : Number Description Numbers, lots of them... Commands : String Description String support allows you to manipulate text with E2. Text screens now have an input for strings. Commands Create a string by wrapping the text in quotation marks, for example; "text goes here". Equal ( ) and Not equal (!=) operators are available, as is concatenation (+), for joining strings and numbers in any order. Concatenation returns a string. The first character of a string has the index 1. Negative indices are counted from the end of the string, with the last character being -1. Positive indices will be capped to the string's length. : Entity Description These entity functions allow you to get information from, and directly manipulate, entities in the game world (such as props). Entities can be found using many methods, from target finders, entity markers and even the expression itself with entity() from selfaware. Since the expression collects the data directly from the entity, it is much faster to handle calculations from within the E2 than having a beacon-sensor send its information to the gate. A valid entity will return true in an if-statement. This is helpful for preventing LUA errors resulting from using entity commands on entities which have been destroyed. Commands The only operators available for entities are equal and not equal. In addition, if(Entity) will return true only if there is a valid entity. : :1) This is not the stored amount, no known weapon has a secondary clip, the AR2 and smg only have a storage, not a clip :2) For most valid entities, E: E:toLocal(E:pos()+E:forward()) vec(1, 0, 0) E:toLocal(E:pos()+E:right()) vec(0,-1, 0) E:toLocal(E:pos()+E:up()) vec(0, 0, 1) :Some entities (vehicles for instance) have differing axes. Attachment documentation at http://www.wiremod.com/forum/wiremod-tutorials/14813-e2-entity-attachment-documentation.html Vector Description Vectors are now properly implemented in the Expression 2, which means that they are as easy to work with as numbers. For those that know what vectors are, and how to use them, this is a great tool for creating many things. 2D and 4D vectors are also supported by E2. These include all the standard functions of 3D vectors listed here. If you're doing 2D vector operations, you can now do things much more efficiently. 4D vectors work in conjunction with matrices, and can be used as homogeneous representations of 3D vectors. Operational functions can be used between numbers and vectors, e.g. N*V. Note that operations cannot be performed between two vectors of different size, for example multiplication between a 2D and a 3D vector. 2D Vector Commands Functions specific to 2D vectors : 3D Vector Commands Functions specific to 3D vectors : 4D Vector Commands Functions specific to 4D vectors. From a mathematics standpoint these are treated as 4D Cartesian vectors, where the 4th component is referred to as "w". : Common Vector Commands Functions that apply to 2D and 3D vectors. They are written here in terms of 3D vectors, but apply to 2D and 4D vectors in the same way, also returning 2D or 4D vectors where applicable. : Matrix Developed by: Jimlad Description 2x2, 3x3 and 4x4 matrices are now supported in Expression 2. These are for more advanced manipulations involving vectors and numbers. As with vectors, for those with the relevant knowledge these can be very useful tools. Basic operations supported: * Matrix addition and subtraction * Multiplication by scalars, vectors and matrices * Division by a scalar * Exponentiation (only integers between -1 and 2) * Delta of a matrix (returns a matrix) NOTES: Similarly to vectors, 3x3 matrix commands are referred to using "matrix", whereas 2x2 and 4x4 matrix commands use "matrix2" and "matrix4" The "set" and "swap" functions are like the 3D vector "set" functions; they do not affect the original matrix. Remember that operations will only work on vectors/matrices of a similar size. You cannot, for example, multiply a 3x3 matrix by a 2D vector. Also, all vectors are treated as column vectors for the purposes of matrices, so M*V will return a vector but V*M is undefined. 2x2 Matrix Commands Functions specific to 2x2 matrices : 2x2 Matrix Commands Functions specific to 2x2 matrices :: 3x3 Matrix Commands Functions specific to 3x3 matrices : *'' If you want to create a rotation matrix about the axes (1,0,0), (0,1,0) or (0,0,1), either use the V:rotate function, or construct a standard rotation matrix. '''4x4 Matrix Commands' Functions specific to 4x4 matrices : Common Matrix Commands Functions that apply to 2x2, 3x3 and 4x4 matrices. They are written here in terms of 3x3 matrices, but apply to 2x2's and 4x4's in the same way. Operations will only return vectors/matrices of similar sizes. For example, the row() function on a 2x2 matrix will return a 2D vector : NOTE: To get the inverse of a matrix, simply raise the matrix to the power of -1. Use this sparingly as it can be computationally expensive! Remember that if your matrix is orthogonal (e.g. rotation matrices), the inverse is equal to the transpose, so use the transpose instead if you can. Inverse is not available for 4x4 matrices. Instead, see usage of the inverseA(M4) function. Angle Description Like 3 different directions can be expressed as a Vector, the angles of Pitch, Yaw and Roll can be expressed as an angle Vector. This in the least has the advantage that when performing functions which use angles, such as vector rotation or creating vectors from angles, you don't have to write the Pitch, Yaw and Roll components, only the Angle. Commands : Table Description Tables are a way to store variables. You can think of a table as a list of data, where each data is addressed with either a number or a string. Tables can contain any datatype, including other tables. There is, however, a max table depth (default 6) Assigning one table variable to equal another will make them both refer to the same table. If you want to make a new copy of a table which will thereafter be set and retrieved from independently of the original table, you must use clone(). Related Examples *Table-RAM by Magos Mechanicus Commands In the interest of brevity, some commands which have many variants are shown as a pattern. may be substituted with the capitalized name of any supported datatype, and * is the corresponding datatype symbol. For instance, T:push(*) can mean T:pushNumber(N), or T:pushString(S). : Array Thanks to: Erkle Description Same as table, but with much less memory footprint and is numerically indexed instead. It is similar to E1's packet support. Arrays can contain any datatype except table and array. The index 0 and even negative and non-integer indices can be used, but to get the most out of the array functions it is advisable to start at index 1 and not to leave any gaps. If you don't follow these guidelines, push/pop/count might misbehave. An array automatically deletes elements that you fill with 0/""/noentity()/nobone()/noranger() or any other zero element. Arrays are limited to 1048576 elements by default. Commands In the interest of brevity, some commands which have many variants are shown as a pattern. may be substituted with the capitalized name of any supported datatype, and * is the corresponding datatype symbol. For instance, R:push(*) can mean R:pushNumber(N), or R:pushString(S). : Bone Developed by: TomyLobo Description This extension gives E2 support for bone entities. A bone can be any part of any ragdoll (head, left arm, right leg, etc). You can get a bone's position, orientation, velocity, etc, much like with regular props (although some things are missing). Array and table functions for bones are also provided. Commands : Wirelink Description Wirelinks are an alternative to normal wires that offer a number of advantages. Any number of inputs or outputs on a component can be manipulated with one Wirelink, and you can also use it to retrieve the entity of a wirelinked component. Since all Wirelinks are capable of two-way communication, wirelinks are not clear-cut inputs or outputs. As such, to avoid ambiguity wirelinks which the expression should be able to manipulate are always declared in the @inputs of the expression. To connect this input to another component, you must use the Wirelink tool on the component to create a new output on it of the type Wirelink, then wire the input to the output as normal. Commands Equal and Not Equal operators are available. XWL here means the Wirelink input. : Complex Developed by: Fizyk Description Complex numbers are an extension of real numbers to include roots of negative numbers as well. They support all basic operations, like addition, subtraction, multiplication, division and raising to a power. Also operations with real numbers are supported, like N+C etc. There are comparison operators and !=, no < and > though, as those are undefined for complex numbers. Commands : Quaternion Developed by: Fizyk Description Quaternions are an extension of complex numbers. Instead of a+b'i', they are of form a+b'i'+c'j'+d'k', where a, b, c, d are real numbers, and i''', '''j, k''' are imaginary units. The imaginary units can be used as a basis in a 3D space, allowing quaternions to represent rotations. Like on real and complex numbers, on quaternions you can perform addition, subtraction, multiplication and division. Operations that take a quaternion and a real/complex number are also supported (N+Q, Q*C, etc.). Beware: quaternion multiplication isn't commutative! '''Note: Because multiplication isn't commutative with quaternions, there are two ways of dividing them. Q1/Q2 is the same as Q1*inv(Q2), the second way is inv(Q2)*Q1. The extension also supports multiplying quaternions by vectors for the purpose of rotations. If you want to rotate vector V using quaternion Q, use this code: V2 = vec(Q*V*inv(Q)) A short guide on quaternions can be found here: http://www.wiremod.com/forum/expression-1-2/14103-short-quaternions-guide.html Commands : Basic extensions Core Description This is where things directly related to E2 are kept Commands : Self-Aware Description With entity() you can use Entity-Support to get all the data from the expression-entity. With concmd() you can execute console commands. Also, the chip has the ability to force itself. Forces aren't dispersed over a certain amount of time, all forces applied to an object within a tick are added up and then applied to the object. Force commands are best used with runOnTick(N) because you won't end up applying more than 1 force per tick and it is easier to do things like defy gravity. Commands : Debug Description Contains various functions for displaying values to the user. print() and hint() allow you to display strings quickly on your screen. Keep in mind that chat messages can be faked using E:printColorDriver(...) and E:printColorDriver®. The game will display a warning message when first used on someone by a specific chip. Commands : Timer Description Timer functions are a way to trigger the expression to be run at a given time. Most interesting is the interval(N) function, that lets the expression be run continuously without needing triggering from inputs. Commands : *'' Both curtime() and realtime() are given to 3 decimal places. Server lag will cause curtime() to slow down, but not realtime(). Unit Conversion '''Description' All conversions are precise so it is recommended to round the result if it is going to be displayed (round()). Commands : Units : : : Server Information Developed by: Beer Description The following functions allow you to get various information about the server, such as the current map name, gamemode, etc. ' Commands ' : : Constraint Developed by: ZeikJT Description The following functions get information about entities based on constraints ' Commands ' : : Chat Developed by: ZeikJT & Gwahir Description The following functions are for reading the chat log. This is similar to the text receiver. Commands : Color Developed by: Jimlad Description These commands allow E2 to find the color of an entity and change it. Changing color only works on entities you own. Uses RGBA (Red, Green, Blue, Alpha) values, although when only RGB is specified, alpha will not be changed. Note that color values have a range of 0 - 255, where (0,0,0,255) is black, and (255,255,255,255) is white. Alpha is equivalent to opacity, where 0 is completely transparent and 255 is completely opaque. Commands : Advanced extensions E2 Function System Developed by: Rusketh Description This allows the user to create functions in their E2 code. Functions must be defined before they are used, which means they are typically at the top of the code. Functions are created at runtime so they should only be declaired once, additionally this also allows you overwrite existing custom functions as long as the return type is not changed. Existing predefined functions may not be overwritten or changed. This example makes a function equivalent to the built-in entity(N) function. It takes one parameter, which is a number called EntityID, and returns an entity. Function names must start with a lowercase letter. function entity doSomething(EntityID) { return entity(EntityID) } You can call it like any other function: print(doSomething(1)) If a function doesn't return anything, the return type should be "void" or can be left blank. function void notReturningAnything() { print("hi") } If a parameter is not a number, then you need to specify it's type using "ID:type", as in @persist/@inputs/@outputs directives. function vector doSomethingElse(Number, Vector:vector) { return Vector * Number } Functions can also be defined as methods of another type. While inside the function body, the variable This is used to refer to the object on which this method is being called. The This variable does not obey usual scoping rules (see below). function void entity:forceToward(Pos:vector, Mul) { This:applyForce(Mul*(Pos-This:pos())) } Functions will also run inside there own environment. See the 'E2 Variable Scopes' section for more information. Entity Discovery Developed by: Gwahir, TomyLobo Description Use these to find and filter entities. The basic find functions will return how many entities were found but the actual entities are stored on the chip until they are accessed using find(), findResult(N), or findClosest(V) There is a white list and a black list as well as functions for on the spot filtering and sorting White and black lists are always in effect and will be used automatically when you request a new list of entities. Control of the lists is achieved through the findAllow, Include, DisallowProp, Model, Class functions Exclude/Allow add/remove items from the black list while Include/Disallow do the same for the white list If the same object is covered by both the white list and the black list, the black list takes priority In the case of names, classes and models, partial strings are acceptable. Discovering entities is not cheap so suggested usage is to find what you're looking for an hold onto it in order to limit the number of queries you run. To prevent overuse of these features, two console variables have been included, wire_exp2_entFindRate and wire_exp2_playerFindRate. These are delays that control how often you can perform find queries. This means that you cannot run find functions every tick with runOnTick(1)! The ent variable is per chip, the player variable is for all chip owned by a specific player. Commands : Global Variables Developed by: Divran (Original idea by ZeikJT) Description Global variables are a way to exchange data between two expression chips without the need for any wiring at all. All variables in a non-shared table will automatically be removed if you disconnect from the server. Remember that variables in a shared table will not automatically be removed, so don't spam too many of them. Shared means that any E2 can access the globals, not only your own. Non-shared allows only your own E2's to access your globals. Commands : Built-In Ranger Developed by: ZeikJT Description The built-in ranger is based on Erkle's original ranger. There are however some new functionalities that can be found in the commands below. Keep in mind that if you want to apply an option you must set it before getting the ranger data. To make ranger settings (like filters, "ignore world", "hit water") persist, run rangerPersist(1). This also introduces a new Variable type, the RD (defined as :ranger). It holds the data returned after a trace, you will need to use the trace data functions to retrieve useful data. These are to be used after you have done an actual trace. I will add a simple example to showcase the syntax and functionality. Commands : Sound Playback Developed by: ZeikJT Description Allows Expression 2 to play sounds. NEW: Expression2 Now has a Sound Browser, Use it instead! The Duration is in seconds. If the sound is meant to be looped, set the duration to zero. If a sound is not designed to be looped (i.e: actor talking), it won't loop. The path must contain slashes '/' and not backslashes '\'. The soundPlay functions can optionally play from an entity that you own. Commands : NPC control Developed by: Bobsymalone Description These functions allow you to control NPCs. You can create secondary AI systems responding to wire by telling NPCs how to feel about certain things, where to go, etc. You can also equip them with weapons. Commands : Signals Developed by: Gwahir, TomyLobo Description These functions allow you to remotely execute exp2 chips, provided that chip is set to receive the given signal =Scope= Signals are restricted to certain scopes (only you, anyone, only others) (0,1,2) Simplified, true = anyone, false = only you. Scopes are used to restrict both who can receive your signal and who's signal you can receive. Scopes are always relative to the owner of the chip. So if player A sends to scope 1 and player B only receives from scope 0, he/she won't receive it, but player B will receive it with scopes 1 or 2 =Group= Set the chip's group with signalSetGroup(S) before calling the related runOnSignal, sendSignal, or signalSetOnRemove function The chip's signal group is always "default" at the start of every execution. runOnSignal() will subscribe to the given signal within the current group, this applies to sent signals as well. Any signal the chip receives will run the chip regardless of its current group (so long as it subscribed to the signal and group of the sent signal) A chip will never run because of a signal it sent itself. Signals are issued 10ms after the first unissued signal was sent. There can only ever be one unissued signal/group combination per receiver in each scope. Commands : Data Signals Developed by: Divran Description This extension allows you to transmit data and execute E2s remotely. Remember: When sending a table or array, it only sends the table reference. This means that if you then edit the table back on the first E2, the table will also be edited on the second E2. To fix this, if needed, use the clone() function before or after sending. =Scope= As mentioned above, you can set the scope of the E2 itself in order to choose which signals it should allow. If you set the scope of the E2 itself, the following will happen: * 0: Only allow signals from E2s you own. * 1: Allow signals from E2s you own and from people in your prop protection friends list. * 2: Allow signals from anyone. You can also choose which scope to send a signal to when you call the send functions. If you choose the scope while calling the function, the following will happen: * 0: Only send to your E2s. * 1: Send to your E2s and the people who have you in their prop protection friends list. * 2: Send to everyone. The default scope is 0. =Group= When I said "send to everyone" above, I didn't mean every single E2 on the map. It sends to everyone in a specific group. You can change the group of the E2 at any time, and you can specify which group to send a signal to. The E2 is not in a group by default, and you must join a group in order to receive any non-direct signals. =Signal Names= Signal names serve no other purpose than to identify the signal so that the recieving E2 can know what to do with the data. Commands Note that *'' can be replaced by any variable type. : GLON '''Developed by:' TomyLobo Description This extension allows you to serialize (=turn into a string) an array or table of values. Unsupported element types are: * Wirelink (this is deliberate, to stop you hacking other people's wirelinks) * Bone * some entity types (Vehicle, NPC, Weapon) * ranger data if the ranger was pointed at one of the entity types mentioned previously. Commands : 3D Holograms Developed by: McLovin & ZeikJT Description Adds the ability to project 3D objects. These objects can't be interacted with like most props; the only way to manipulate them is to use these functions. When using the holoCreate function, bear in mind that there is a delay associated with spawning holograms to avoid lagging servers. Avoid using holoCreate every execution. In general you should only ever use the holoCreate function once for each hologram in your code, for example by using the first() condition. Use the other functions like holoPos to update them thereafter. Note that except for wire_holograms_display_owners, wire_holograms_block_client and wire_holograms_unblock_client all other console commands are useable by admins only! Console Variables : Commands : File:holo_hq_cone.JPG|hq_cone File:holo_hq_cubinder.JPG|hq_cubinder File:holo_hq_cylinder.JPG|hq_cylinder File:holo_hq_dome.JPG|hq_dome File:holo_hq_hdome.JPG|hq_hdome File:holo_hq_hdome_thick.JPG|hq_hdome_thick File:holo_hq_hdome_thin.JPG|hq_hdome_thin File:holo_hq_icosphere.JPG|hq_icosphere File:holo_hq_rcube.JPG|hq_rcube File:holo_hq_rcube_thick.JPG|hq_rcube_thick File:holo_hq_rcube_thin.JPG|hq_rcube_thin File:holo_hq_rcylinder.JPG|hq_rcylinder File:holo_hq_rcylinder_thick.JPG|hq_rcylinder_thick File:holo_hq_rcylinder_thin.JPG|hq_rcylinder_thin File:holo_hq_sphere.JPG|hq_sphere File:holo_hq_stube.JPG|hq_stube File:holo_hq_stube_thick.JPG|hq_stube_thick File:holo_hq_stube_thin.JPG|hq_stube_thin File:holo_hq_torus.JPG|hq_torus File:holo_hq_torus_thick.JPG|hq_torus_thick File:holo_hq_torus_thin.JPG|hq_torus_thin File:holo_hq_tube.JPG|hq_tube File:holo_hq_tube_thick.JPG|hq_tube_thick File:holo_hq_tube_thin.JPG|hq_tube_thin File Functions Developed by: McLovin Description The file functions are used to write text to files, stream files from client to server, and edit files. Important: All the filenames must end in *.txt! Files are loaded from the "garrysmod/data/e2files" folder. You can also load files from one of these other folders by prefixing the file name with ">special-folder-name/" (without quotes). * e1shared = garrysmod/data/ExpressionGate/e2shared * e2shared = garrysmod/data/Expression2/e2shared * cpushared = garrysmod/data/CPUChip/e2shared * gpushared = garrysmod/data/GPUChip/e2shared As of 25/10/2010, this is a new system for file access. If you have not updated Wiremod very recently, update it to use these new functions. Warning: Double quotation marks (") are replaced with single quotation marks (') in uploaded files. This is not intended behavior. Files cannot contain a null byte (0x00). Binary files lacking a null byte can be loaded and parsed, but there are no functions to assist with that in E2. Commands : HTTP Functions Developed by: McLovin Description The HTTP functions are used to recieve data through HTTP. Only one request can be made at a time and a delay between requests is also in place to stop spamming of functions. Console Variables : Commands : Bitwise Developed by: asiekierka, TomyLobo (made xor), and Divran (added operators) Description Bitwise is carried out at a binary level. The individual bits of a number have operations taken against them. Wikipedia has a good explanation of each function: http://en.wikipedia.org/wiki/Bitwise_operation Tip: You can also use N:toString(2) and S:toNumber(2) to perform bitwise manipulation using the string functions. Commands : E2 Variable Scopes Developed by: Rusketh Description Variables in E2 can now be assigned to scopes unlike previous versions of E2 where all variables where global. A global variable is one that can be accessed from every point inside the E2 code, unlike local variables which can only be accessed from inside the block they are declared. When your E2 code starts to get complex, local variables are a useful way to insure that only one block of code has access to its own set of variables. This prevents scripting errors when one block of code inadvertently modifies variables used by another block of code. All variables defined as either an Input, an Output or a Peristant will always be in the global scope. Custom functions will run inside their own environment meaning they only have access to global variables and variables defined inside their own scopes. Example Variable = vec(20,30,40) #This is a Global variable if ( Variable ) { local Variable = "Test" #This is a local variable } See Also *Expression 2 Guide *Expression 2 syntax higlighting for Notepad++ *E2Edit, a stand alone expression 2 editor. By itsbth Credits I would like to extend thanks to all of the following people who have made contributions to Expression 2 in one way or another, making it into what it is today. Shandolum, ZeikJT, Jimlad, Beer, Magos Mechanicus, Gwahir, chinoto, pl0x, Turck3, Ph3wl, Hunter234564, Fishface60, GUN, Bobsymalone, TomyLobo, Tolyzor, Jeremydeath, I am McLovin, Fizyk, Divran, Rusketh And of course all you others out there who use it, provide constructive feedback or help others become familiar with it! Thank you! // Syranide P.S. I'm sorry if I forgot to mention someone! Category:Expression 2